/**
 * @author fanxuean
 * @link fanshine124@gmail.com
 * @description 框架管理器
 * @return Object {}
 */

MIDB.Model.FrameManager = (function(){
    var uniqueInstance;
    function constructor() {
        var p = {
            models : {},
            mainDiv : null,
            contentDiv : null,
            frame_content_wh : {
                w : 0,
                h : 0
            },
            curMid : null,
            menu_tmpl : null,
            menuContainer : null
        };
        /**
         * @description 初始化菜单
         */
        var initMenu = function(userid) {
            var tmpl = p.menu_tmpl.html();
            var doTtmpl = doT.template(tmpl);
            // 从后台加载菜单
            // getUserMenu(userid, function(d) {
            //     menuIteration(d, doTtmpl, $(p.menuContainer));
            //     bindMenuEvent();
            // });
            // test with testdata below
            menuIteration(menuList, doTtmpl, $(p.menuContainer));
            bindMenuEvent();
        };
        /**
         * @description 获取用户菜单列表
         * @param {Object}
         *            userid 用户id
         * @param {Object}
         *            f 回调函数
         * @result Json d json数据
         */
        var getUserMenu = function(userid, f) {
            $.ajax({
                url : MIDB.ajaxUrl.menuList,
                type : 'POST',
                data : {
                    userid : userid
                },
                dataType : 'json',
                success : function(d) {
                    if (d) {
                        // alert('查询用户菜单列表成功!');
                        f.call(this, d);
                    }
                },
                error : function(err) {
                    // alert('查询用户菜单列表失败!');
                }
            });
        };
        /**
         * @description 菜单迭代加载
         * @param {Object}
         *            d
         * @param {Object}
         *            doTtmpl
         * @param {Object}
         *            container
         */
        var menuIteration = function(d, doTtmpl, container) {
            $(container).append(doTtmpl(d));
            $(d.c).each(function(i) {
                var m = this;
                if (m.c && m.c.length > 0) {
                    menuIteration(m, doTtmpl, $(p.mainDiv).find('.user_menu_box .li_' + m.l + "_" + i));
                }
            });
        };
        /**
         * @description 菜单事件绑定
         */
        var bindMenuEvent = function() {
            $(p.menuContainer).find("li").hover(function() {
                $(this).find('ul:first').show();
            }, function() {
                $(this).find('ul:first').hide();
            }).click(function(e) {
                var mid = $(this).attr('mid'),
                    tmpl = $('#' + $(this).attr('tmpl')),
                    pageTmpl = $('#' + $(this).attr('pageTmpl'));
                if(!$(this).hasClass('menu_selected')) {
                    $(this).addClass('menu_selected').siblings().removeClass('menu_selected');
                }
                if (mid && tmpl) {
                    changeModel(mid, tmpl, pageTmpl);
                    e.stopPropagation();
                }
            });
            $(p.menuContainer).find("li:eq(1)").trigger('click');
        };
        /**
         * @description 模块切换/加载器
         * @param {Object} mid [模块id]
         * @param {Object} pageTmpl [分页模板对象]
         * @param {Object} tmpl [模块静态页面模板]
         */
        var changeModel = function(mid, tmpl, pageTmpl) {
            // hideModel();
            // if ($('#' + mid).length > 0 && p.models[mid]) {
            //     p.models[mid].showModel();
            //     return false;
            // }
            // var subContent = $('<div>');
            // subContent.attr('id', mid);
            // subContent.addClass("modelDiv").css({
            //     width : p.frame_content_wh.w - p.frame_content_wh.cut,
            //     height : p.frame_content_wh.h - p.frame_content_wh.cut
            // });
            // $(subContent).appendTo(p.contentDiv);

            if(mid === 'userInfo') p.mainDiv.find('.pagination').hide();
            if(p.models[mid]) {
                p.models[mid].init(param);
                return false;
            }

            var nf = (new Function('return ' + MIDB.models[mid] + '.getInstance()'))();
            var param = {
                mid: mid,
                tmpl: tmpl,
                pageTmpl : pageTmpl,
                tmplContainer: p.contentDiv,
                contentContainer: p.mainDiv.find('.content_area_wrap'),
                navContainer: p.mainDiv.find('.user_menu_box')
            };
            if (nf) p.models[mid] = nf.init(param);
            // $(subContent).load(url, {}, function() {
            //     var nf = new Function('return ' + MIDB.models[mid] + '.getInstance()');
            //     if (nf()) p.models[mid] = nf().init(mid);
            // });
        };
        /**
         * @description 隐藏目前显示的模块
         */
        // var hideModel = function() {
        //     var modelDivs = $(p.contentDiv).find('.modelDiv');
        //     // if ($(p.mainDiv).find('.welcome').css('display') != 'none') {
        //     //     $(p.mainDiv).find('.welcome').hide().siblings('.frame_content').removeClass('hidden');
        //     // }
        //     if (modelDivs.length === 0)
        //         return false;
        //     modelDivs.each(function() {
        //         if ($(this).attr('display') != 'none') {
        //             var mid = $(this).attr('id');
        //             p.models[mid].hideModel();
        //         }
        //     });
        // };

        var initLoginInfo = function(callback) {
            // 用户信息
            // $.ajax({
            //     url : MIDB.ajaxUrl.userInfo,
            //     type : 'POST',
            //     dataType : 'json',
            //     data : {},
            //     complete : function(xhr, textStatus) {
            //         // called when complete
            //     },
            //     success : function(data, textStatus, xhr) {
            //         MIDB.cache.user = data;
            //         compileUserInfo(data);
            //     },
            //     error : function(xhr, textStatus, errorThrown) {
            //         // called when there is an error
            //     }
            // });
            var userInfo = $.cookie("MIDB_USER_INFO");
            if(!userInfo) return false;
            MIDB.cache.user = JSON.parse(userInfo);
            compileUserInfo(MIDB.cache.user);
            if(callback) callback(MIDB.cache.user.user_code);
        };
        var compileUserInfo = function(data) {
            var userBox = p.mainDiv.find('.user_info_box > ul');
            p.mainDiv
            .find('.user_name_box > span').text(data.user_name).end()
            .find('.user_info_box > a').toggle(function(event) {
                userBox.removeClass('hidden');
            }, function() {
                userBox.addClass('hidden');
            }).end()
            .find('.user_info_box > ul').click(function(event) {
                var clickDom = event.target;
                var actype = $(clickDom).attr('class');
                switch(actype) {
                    case 'user_base_info':
                        p.menuContainer.find('li:eq(0)').trigger('click');
                        break;
                    case 'reset_password':
                        // todo
                        break;
                    case 'logout':

                        break;
                }

            });
        };
        var initUtilFuns = function() {

        };

        return {
            init: function(options) {
                p = $.extend({}, p || {}, options || {});

                // todo
                // initUtilFuns();
                initLoginInfo(function() {
                    initMenu();
                });
                return this;
            },
            operateModel: function(mid, param) {
                var selectedMenu = $(p.menuContainer).find("li[mid=" + mid + "]");
                if(!p.models[mid]) selectedMenu.trigger('click');
                else {
                    if(!selectedMenu.hasClass('menu_selected')) selectedMenu.addClass('menu_selected').siblings().removeClass('menu_selected');
                }
                p.models[mid].showModel(param);

            }
        };
    }
    return {
        getInstance : function() {
            if (!uniqueInstance) {
                uniqueInstance = constructor();
            }
            return uniqueInstance;
        }
    };
})();